package com.zzy.mccjt.model;

import com.alibaba.ttl.TransmittableThreadLocal;
import com.zzy.mccjt.constant.RequestConstant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.slf4j.MDC;

/**
 * @program: mccjt-cloud
 * @description:
 * @author: zhouyang.zheng
 * @create: 2022-08-02 17:55
 **/
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class CurrentUser {
    /**
     * 用户类型
     */
    private Integer type;
    private Long id;

    /**
     * TransmittableThreadLocal是阿里开源的一个类，主要目的是处理父子线程变量不能共用的情况。ThreadLocal是跟当前线程挂钩的，所以脱离当前线程它就起不了作用。
     *
     * ThreadLocal
     *
     * 场景：它的应用就是比如当前用户特有的一些属性，不能跟其他线程，用户共用。
     *
     * TransmittableThreadLocal
     *
     * 场景：就是父子线程或者不同线程需要共用一些变量。
     */
    private static final TransmittableThreadLocal<CurrentUser> CURRENT = new TransmittableThreadLocal<>();

    public static CurrentUser get() {
        return CURRENT.get();
    }

    public static void set(int type, long id) {
        CurrentUser currentUser = new CurrentUser(type, id);
        CURRENT.set(currentUser);
        MDC.put(RequestConstant.CURRENT_USER, String.valueOf(id));
        MDC.put(RequestConstant.USER_FLAG, String.valueOf(type));
    }

    public static void clear() {
        CURRENT.remove();
        MDC.remove(RequestConstant.CURRENT_USER);
        MDC.remove(RequestConstant.USER_FLAG);
    }
}

